//实现线程安全版本的单例模式 - 懒汉模式
public class Singleton {
    private static volatile Singleton instance = null;
    public static Singleton getInstance(){
        //通过判断对象是否为空，决定是不是要加锁，防止每次获取对象都要先加锁，不同线程进行锁竞争，造成阻塞，降低效率
        if(instance == null){
            //通过加锁，使得不同线程调用时，不会再创建一个新的对象，保证线程安全
            synchronized (Singleton.class){
                if(instance == null){
                    //在new对象的时候，编译器可能会优化代码，形成指令重排序
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
    private Singleton() { }
}

//实现线程安全版本的单例模式 - 饿汉模式
class Singleton1{
    private static Singleton1 instance = new Singleton1();
    public static Singleton1 getInstance(){
        return instance;
    }
    private Singleton1() { }
}